%RBF基本原理
clear
clc
close all

%插值控制点
x_control=0.2:0.5:3;
y_control=sin(2*pi*0.5*x_control)+cos(2*pi*0.8*x_control)+2;
%原函数
x_org=0:0.02:3;
y_org=sin(2*pi*0.5*x_org)+cos(2*pi*0.8*x_org)+2;

figure()
hold on
plot(x_org,y_org)
plot(x_control,y_control,'o','MarkerSize',8)
hold off

%1构造函数
N_k=length(x_control);%构造函数的数量
RBF_Kernel=cell(N_k,1);
epsilon =0.3;%带宽参数,控制了径向基函数的宽度，即函数的“扩散”程度
for k=1:N_k
    x_k=x_control(k);%中心位置，插值节点
    RBF_Kernel_k=@(x) exp(-(x-x_k).^2/(2*epsilon^2));%正态函数
    RBF_Kernel{k}=RBF_Kernel_k;%储存每个基函数
end

%2计算出插值矩阵
InterpMat=zeros(N_k,N_k);
for k=1:N_k
    RBF_phi_k=RBF_Kernel{k}(x_control);%计算出当前正态函数
    InterpMat(:,k)=RBF_phi_k(:);%插值矩阵，每一列储存的都是对应的正态函数
end

%3利用插值矩阵求解出每个高斯函数的权重
%∑φ(k)*w(k)=InterpMat*w=y0，可以线性求逆直接得到系数w
w=InterpMat\y_control';%左除运算符

%绘制出每个正态函数
figure()
hold on
mcp=colormap('lines');
for k=1:N_k
    RBF_phi2_k=RBF_Kernel{k}(x_org)*w(k);
    plot(x_org,RBF_phi2_k,'Color',mcp(k,:))
    plot([x_control(k),x_control(k)],[0,RBF_Kernel{k}(x_control(k))*w(k)],'Color',mcp(k,:),'LineStyle','--')
end
plot(x_org,y_org,'Color','k','LineWidth',2)
hold off

%绘制出最终相加的结果
y_RBF=zeros(size(y_org));
for k=1:N_k
    y_RBF=y_RBF+RBF_Kernel{k}(x_org)*w(k);%叠加每一个正态函数
end
figure()
hold on
plot(x_org,y_org)
plot(x_org,y_RBF,'--')
plot(x_control,y_control,'o','MarkerSize',8)
legend({'原函数','RBF插值结果'},'Location','best')



